package cn.edu.hyit.hjq.volunteems.backend.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Slf4j
@Service
public class RedisService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 存储键值对并设置过期时间
     *
     * @param key 键，用于唯一标识存储的值
     * @param value 值，存储的数据对象
     * @param timeout 过期时间，表示值在指定时间后将被自动删除
     * @param unit 时间单位，定义过期时间的度量单位
     */
    public void set(String key, Object value, long timeout, TimeUnit unit) {
        redisTemplate.opsForValue().set(key, value, timeout, unit);
    }

    /**
     * 设置 Hash 类型的键值对（泛型化方法）
     *
     * @param key     Hash 的主键
     * @param hashKey Hash 内部的键
     * @param value   要存储的值
     * @return 操作是否成功
     */
    public <T> boolean setHashValue(String key, String hashKey, T value) {
        try {
            redisTemplate.opsForHash().put(key, hashKey, value);
            return true;
        } catch (Exception e) {
            // 可以记录日志或做其他异常处理
            log.error("RedisService.setHashValue() 发生异常：");
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 设置Redis键的过期时间
     *
     * @param key Redis键名，用于唯一标识存储的数据
     * @param timeout 键的过期时间，当时间到达后，键值对将被自动删除
     * @param unit 过期时间的时间单位，用于解释timeout参数的粒度，如秒、分钟等
     */
    public void expire(String key, long timeout, TimeUnit unit) {
        redisTemplate.expire(key, timeout, unit);
    }

    /**
     * 获取存储在Redis中的值
     *
     * @param key 键，用于标识存储在Redis中的值
     * @return 对应键的值，如果键不存在则返回null
     */
    public Object get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 获取指定 key 对应的 Hash 表中所有字段和值
     *
     * @param key Redis 中的键，通常是 token:xxxxx 的形式
     * @return 返回一个 Map，包含 Hash 中的所有字段和对应的值
     */
    public Map<Object, Object> getHashValues(String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * 删除指定的键
     *
     * @param key 要删除的键
     * @return 返回删除操作的结果，true表示删除成功，false表示删除失败
     */
    public Boolean delete(String key) {
        return redisTemplate.delete(key);
    }

    /**
     * 检查Redis中是否存在指定的键
     *
     * @param key 要检查的键
     * @return 如果键存在，则返回true；否则返回false
     */
    public Boolean hasKey(String key) {
        return redisTemplate.hasKey(key);
    }
}
